package br.com.ucb.invista.dao;

import java.io.Serializable;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.persistence.EntityManager;

import br.com.ucb.invista.connection.EntityManagerFactory;
import br.com.ucb.invista.domain.Produto;

public class ProdutoDao implements Serializable{
	
	private static final long serialVersionUID = 1L;
	
	private EntityManager entityManager;
	private Produto produto;
	private List<Produto> listaProdutos;
	
	@SuppressWarnings("unchecked")
	public ProdutoDao() {
		this.entityManager = EntityManagerFactory.getEntityManager();
		this.produto = new Produto();
		this.listaProdutos = entityManager.createQuery("from Produto order by nome").getResultList();
	}
	
	@SuppressWarnings("unchecked")
	public List<Produto> listar() {
		return entityManager.createQuery("from Produto order by nome").getResultList();
	}
	
	public Boolean salvar(Produto produtoParametro) {
		try {
			this.entityManager.getTransaction().begin();
				this.entityManager.persist(produtoParametro);
					this.entityManager.getTransaction().commit();
						String mensagemSucesso = "O registro foi Persistido com Sucesso!";
							FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagemSucesso, "");
								FacesContext.getCurrentInstance().addMessage(null, mensagem);
			return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Persistir a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}
	
	public Boolean alterar(Produto produtoParametro) {
		try {
			this.entityManager.getTransaction().begin();
				this.entityManager.merge(produtoParametro);
					this.entityManager.getTransaction().commit();
			return true;
		} catch (Exception exception) {
			this.entityManager.getTransaction().rollback();
			System.out.println("Erro ao tentar Persistir a Entidade: " + exception.getMessage());
			exception.printStackTrace();
		}
		return false;
	}

	public Boolean excluir(Produto produtoParametro) {
		try {
			entityManager.getTransaction().begin();
				entityManager.remove(produtoParametro);
					System.out.println("O registro foi Excluido com Sucesso");
						entityManager.getTransaction().commit();
						
			String mensagemSucesso = "O registro foi Excluido com Sucesso!";
			FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_INFO, mensagemSucesso, "");
			FacesContext.getCurrentInstance().addMessage(null, mensagem);
			
			return true;
		} catch (Exception exception) {	
			System.out.println(exception.getMessage());
		}
		return false;
	}
	
	public Produto pesquisaCodigo(Long codigoParametro) {
		return entityManager.find(Produto.class, codigoParametro);
	}

	public EntityManager getEntityManager() {
		return entityManager;
	}

	public void setEntityManager(EntityManager entityManager) {
		this.entityManager = entityManager;
	}

	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public List<Produto> getListaProdutos() {
		return listaProdutos;
	}

	public void setListaProdutos(List<Produto> listaProdutos) {
		this.listaProdutos = listaProdutos;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}
}
